package fiuba.algo3;

import java.util.ArrayList;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Element;

public class OrdenDeArresto {
	private String nombre;
	private String sexo;
	private String hobby;
	private String cabello;
	private String senia;
	private String auto;
	private boolean aprobada;
	
	public OrdenDeArresto() {
		this.nombre = "";
		this.sexo = "";
		this.hobby = "";
		this.cabello = "";
		this.senia = "";
		this.auto = "";
		this.aprobada = false;
	}
	
	public Node serializar(Document doc) {
		Element elementoOrden = doc.createElement("OrdenDeArresto");
		elementoOrden.setAttribute("nombre", this.nombre);
		elementoOrden.setAttribute("sexo", this.sexo);
		elementoOrden.setAttribute("hobby", this.hobby);
		elementoOrden.setAttribute("cabello", this.cabello);
		elementoOrden.setAttribute("senia", this.senia);
		elementoOrden.setAttribute("auto", this.auto);
		elementoOrden.setAttribute("aprobada", String.valueOf(this.aprobada));
		return elementoOrden;
	}
	
	public static OrdenDeArresto hidratar(Node elementoOrden) {
		OrdenDeArresto nuevaOrden = new OrdenDeArresto();
		nuevaOrden.nombre = ((Element)elementoOrden).getAttribute("nombre");
		nuevaOrden.sexo = ((Element)elementoOrden).getAttribute("sexo");
		nuevaOrden.hobby = ((Element)elementoOrden).getAttribute("hobby");
		nuevaOrden.cabello = ((Element)elementoOrden).getAttribute("cabello");
		nuevaOrden.senia = ((Element)elementoOrden).getAttribute("senia");
		nuevaOrden.auto = ((Element)elementoOrden).getAttribute("auto");
		nuevaOrden.aprobada = Boolean.valueOf( ((Element)elementoOrden).getAttribute("aprobada") );
		return nuevaOrden;
	}
	
	// GETTERS
	public String getNombre(){
		return this.nombre;
	}
	
	public String getSexo(){
		return this.sexo;
	}
	
	public String getHobby(){
		return this.hobby;
	}
	
	public String getCabello(){
		return this.cabello;
	}
	
	public String getSenia(){
		return this.senia;
	}
	
	public String getAuto(){
		return this.auto;
	}
	// FIN GETTERS

	// SETTERS
	public void setSexo(String sexo) {
		this.sexo = sexo;
	}

	public void setHobby(String hobby) {
		this.hobby = hobby;
	}

	public void setCabello(String cabello) {
		this.cabello = cabello;
	}

	public void setSenia(String senia) {
		this.senia = senia;
	}

	public void setAuto(String auto) {
		this.auto = auto;
	}
	// FIN SETTERS
	
	private enum Descripcion { SEXO, HOBBY, CABELLO, SENIA, AUTO }
	
	public boolean verificarOrdenDeArresto() {
		
		ArrayList<Element> sospechosos = new ArrayList<Element>();
		NodeList listaLadrones = new ManejadorXML().obtenerElementosDeXML( "ladrones.xml", "ladron" );

		if (listaLadrones != null){	
			// Copio lista de sospechosos
			for ( int i = 0; i < listaLadrones.getLength(); i++ ){
				Element ladron = (Element)listaLadrones.item(i);
				sospechosos.add(ladron);
			}

			//Filtra por cada descripcion
			for (Descripcion descripcion : Descripcion.values() ){
				this.filtrarPor(descripcion, sospechosos);	
			}
		}
		
		if (sospechosos.size() == 1){
			this.nombre = (sospechosos.get(0)).getAttribute("nombre");
			this.aprobar();
			return true;
		}
		return false;
	}
	
	private void filtrarPor(Descripcion descripcion, ArrayList<Element> sospechosos) {
		for ( int j = 0; j < sospechosos.size(); j++ ){
			Element ladron = (Element)sospechosos.get(j);
			String caracteristicaSospechoso = ladron.getAttribute( (descripcion.toString()).toLowerCase() );
					
			switch (descripcion){
			case SEXO:
				if ( (this.sexo != "") && ( !this.sexo.equals(caracteristicaSospechoso)) )
					{ sospechosos.remove(j); j = j-1; } break;
			case HOBBY:
				if ( (this.hobby != "") && ( !this.hobby.equals(caracteristicaSospechoso)) )
					{ sospechosos.remove(j); j = j-1; } break;
			case CABELLO:
				if ( (this.cabello != "") && ( !this.cabello.equals(caracteristicaSospechoso)) )
					{ sospechosos.remove(j); j = j-1; } break;
			case SENIA:
				if ( (this.senia != "") && ( !this.senia.equals(caracteristicaSospechoso)) )
					{ sospechosos.remove(j); j = j-1; } break;
			case AUTO:
				if ( (this.auto != "") && ( !this.auto.equals(caracteristicaSospechoso)) )
					{ sospechosos.remove(j);  j = j-1;} break;			
			}
		}
	}
	
	private void aprobar() {
		this.aprobada = true;
	}
	
	public boolean estaAprobada() {
		return this.aprobada;
	}
	
}